/**
 +---------------------------------------------+
 *           一些公用的常量的配置
 +---------------------------------------------+
 */

var Const = {
    notifyType: {
        SUCCESS: 'success',
        DANGER: 'danger'
    },
    btnType: {
        DANGER: 'danger',
        PRIMARY: 'primary',
        WARNING: 'warning',
        INFO: 'info'
    },
    statusCode: {
        SUCCESS: 200
    }
};

/**
 +---------------------------------------------+
 *           页面初始化的方法
 +---------------------------------------------+
 */

(function () {
    String.prototype.format = function () {
        if (arguments.length == 0) return this;
        var param = arguments[0];
        var s = this;
        if (typeof (param) == 'object') {
            for (var key in param)
                s = s.replace(new RegExp("\\{" + key + "\\}", "g"), param[key]);
            return s;
        } else {
            for (var i = 0; i < arguments.length; i++)
                s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);
            return s;
        }
    };


    $(document).ready(function () {
        $select2 = $('.select2');
        // 下拉树形式
        if ($select2.data('tree')) {
            if (typeof $select2.select2tree == 'function') {
                $select2.select2tree();
            }
        }
        // 正常的下拉形式
        else {
            if (typeof $select2.select2 == 'function') {
                // 初始化select2
                $(".select2").select2();
            }
        }
    });
    // ajax 删除数据
    $(document).on('click', '.ajax-del', function () {
        var url = $(this).data('url');
        $.confirm({
            title: '警告',
            content: '确定删除该数据吗?',
            type: 'orange',
            typeAnimated: false,
            buttons: {
                omg: {
                    text: '确定', btnClass: 'btn-orange', action: function () {
                        HsUtils.ajax(url, {}, function () {
                            HsUtils.notify("删除成功", Const.notifyType.SUCCESS);
                            setTimeout(function () {
                                HsUtils.refreshFrame();
                            }, 2000);
                        });
                    }
                },
                close: {text: '取消'}
            }
        });
    });
})();


/**
 +---------------------------------------------+
 *           常用的工具类
 +---------------------------------------------+
 */
var HsUtils = {};


/**
 * 表单数据序列化  表单数据 转 json数据
 *
 * @param el 要序列化的表单
 */
HsUtils.formSerialization = function (el) {
    var formSerial = {};
    $($(el).serializeArray()).each(function () {
        formSerial[this.name] = this.value;
    });
    return formSerial;
};

/**
 * loading 加载
 *
 */
HsUtils.loading = function () {
    lightyear.loading('show');
};

/**
 * loading 关闭
 *
 */
HsUtils.closeLoading = function () {
    lightyear.loading('hide');
};

/**
 * 消息提示
 *
 * @param msg   信息
 * @param type  类型 默认是成功类型
 */
HsUtils.notify = function (msg, type) {
    type = type || Const.notifyType.SUCCESS;
    setTimeout(function () {
        HsUtils.closeLoading();
        lightyear.notify(msg, type);
    }, 1e3)
};

/**
 * ajax请求
 *
 * @param url    地址
 * @param params 参数
 * @param fn     请求成功的回掉函数
 */
HsUtils.ajax = function (url, params, fn) {
    HsUtils.loading();
    $.post(url, params, function (res, status) {
        HsUtils.closeLoading();
        if (Const.statusCode.SUCCESS == res.code) {
            fn && fn(res.data);
        } else {
            HsUtils.notify(res.message, Const.notifyType.DANGER);
        }
    });
};

/**
 * 刷新父级iframe
 *
 */
HsUtils.refreshFrame = function () {
    var frameContentHook = window.parent.$("#frameContentHook");
    frameContentHook.attr('src', frameContentHook.attr('src'));
};

/**
 * 初始化数据表格
 *
 * @param el        要初始化的table
 * @param url       请求数据的地址
 * @param toolbar   工具栏id
 * @param columns   列信息
 *
 */
HsUtils.initDataTable = function (el, url, toolbar, columns) {
    $(el).bootstrapTable({
        url: url,         //请求后台的URL（*）
        method: 'get',                      //请求方式（*）
        toolbar: toolbar,                   //工具按钮用哪个容器
        striped: true,                      //是否显示行间隔色
        cache: false,                       //是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）
        pagination: true,                   //是否显示分页（*）
        sortable: true,                     //是否启用排序
        sortOrder: "desc",                   //排序方式
        sidePagination: "server",           //分页方式：client客户端分页，server服务端分页（*）
        pageNumber: 1,                       //初始化加载第一页，默认第一页
        pageSize: 10,                       //每页的记录行数（*）
        pageList: [5, 10, 25, 50, 100],        //可供选择的每页的行数（*）
        search: true,                       //是否显示表格搜索，此搜索是客户端搜索，不会进服务端，所以，个人感觉意义不大
        strictSearch: true,
        showColumns: true,                  //是否显示所有的列
        showRefresh: true,                  //是否显示刷新按钮
        minimumCountColumns: 2,             //最少允许的列数
        clickToSelect: true,                //是否启用点击选中行
        height: ($(window).height() * 0.8),                        //行高，如果没有设置height属性，表格自动根据记录条数觉得表格高度
        uniqueId: "id",                     //每一行的唯一标识，一般为主键列
        showToggle: true,                    //是否显示详细视图和列表视图的切换按钮
        cardView: false,                    //是否显示详细视图
        detailView: false,                   //是否显示父子表+
        queryParams: function (params) {
            return {   //这里的键的名字和控制器的变量名必须一直，这边改动，控制器也需要改成一样的
                limit: params.limit,   //页面大小
                offset: params.offset,  //页码
                departmentname: $("#txt_search_departmentname").val(),
                statu: $("#txt_search_statu").val(),
                search: params.search
            };
        },
        columns: columns
    });
};

/**
 * 初始化tree表格
 *
 * @param table             要初始化的table
 * @param idField           主键id
 * @param parentIdField     父级id
 * @param treeShowField     在哪一列操作树
 * @param columns           列信息
 * @param data              数据源
 */
HsUtils.initTreeTable = function (table, idField, parentIdField, treeShowField, columns, data) {
    var $treeTable = $(table);
    $treeTable.bootstrapTable({
        data: data,
        idField: idField,
        columns: columns,
        // bootstrap-table-treegrid.js 插件配置 -- start
        //在哪一列展开树形
        treeShowField: treeShowField,
        //指定父id列
        parentIdField: parentIdField,
        onResetView: function (data) {
            $treeTable.treegrid({
                initialState: 'collapsed',// 所有节点都折叠
                treeColumn: 0,
                expanderExpandedClass: 'mdi mdi-minus',  //图标样式
                expanderCollapsedClass: 'mdi mdi-plus',
                onChange: function () {
                    $treeTable.bootstrapTable('resetWidth');
                }
            });
        }
    });
};

/**
 * 表单验证数据
 *
 * @param formEl    表单元素id
 * @param fields    要验证的字段
 * @param cb        验证成功的回掉函数
 */
HsUtils.validateFormData = function (formEl, fields, cb) {


    var $form = $(formEl);
    var bootstrapValidator = $form.bootstrapValidator({
        feedbackIcons: {
            valid: 'mdi mdi-check',
            invalid: 'mdi mdi-information-outline',
            validating: 'mdi mdi-refresh'
        }, fields: fields
    });
    $form.data("bootstrapValidator").validate(); // 手动验证
    var isValid = $form.data("bootstrapValidator").isValid(); // 是否验证成功
    if (isValid) {
        cb && cb();
    }

};

/**
 * 关闭 modal
 *
 */
HsUtils.closeModal = function () {
    window.parent.$('#exampleModal').modal('hide');
    window.parent.$('#modalIframeExample').attr('src', '');
};

/**
 * 验证表单
 *
 * @param formEl        表单元素id
 * @param fields        验证的字段
 * @param cb            验证成功的毁掉
 * @param isFormSubmit  是否直接提交
 */
HsUtils.validateForm = function (formEl, fields, cb, isFormSubmit) {

    isFormSubmit = isFormSubmit == undefined ? true : isFormSubmit;
    var bootstrapValidator = $(formEl).bootstrapValidator({
        feedbackIcons: {
            valid: 'mdi mdi-check',
            invalid: 'mdi mdi-information-outline',
            validating: 'mdi mdi-refresh'
        }, fields: fields
    });
    bootstrapValidator.on('success.form.bv', function (e) {
        e.preventDefault();
        var $form = $(e.target);
        var bv = $form.data('bootstrapValidator');
        if (bv.getSubmitButton()) {
            bv.disableSubmitButtons(false);
        }
        if (isFormSubmit) {
            HsUtils.ajax($form.attr('action'), $form.serialize(), function (data) {
                HsUtils.notify("操作成功");
                setTimeout(function () {
                    cb && cb(bv, data);
                }, 1000);

            });
        } else {
            cb($form.serialize());
        }

    });
};

/**
 * 生成数据表格的操作按钮
 *
 * @param label         按钮标题
 * @param type          类型
 * @param url           地址
 * @param title         打开modal的标题
 * @param formId        动态表单id
 * @returns {*|string}  按钮元素
 */
HsUtils.buildTableActionBtn = function (label, type, url, title, formId) {
    if (url.indexOf("?") == -1) {
        url = url + "?";
    }
    // 表单id不存在 就直接走ajax
    if (formId) {
        return '<button type="button"  data-toggle="modal" data-target="#exampleModal" class="btn btn-sm btn-{0} open-modal"  data-url="{1}&build_form=true&form_id={2}&btn_label={3}" data-title="{4}">{5}</button>'.format(type, url, formId, label, title, label);
    }
    return '<button type="button"   class="btn btn-sm btn-{0} ajax-del"  data-url="{1}" >{2}</button>'.format(type, url, label);

};
